# -*- coding: utf-8 -*-
"""
用户模型
"""
from sqlalchemy import Column, Integer, String, Text, DateTime, SmallInteger
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func
import hashlib

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, autoincrement=True, comment='用户唯一标识符')
    username = Column(String(50), nullable=False, unique=True, comment='用户名')
    email = Column(String(100), nullable=False, unique=True, comment='邮箱地址')
    password_hash = Column(String(255), nullable=False, comment='密码哈希值')
    nickname = Column(String(100), nullable=True, comment='昵称')
    avatar = Column(String(255), nullable=True, comment='头像图片路径')
    bio = Column(Text, nullable=True, comment='个人简介')
    phone = Column(String(20), nullable=True, comment='手机号码')
    status = Column(SmallInteger, nullable=False, default=1, comment='用户状态：0-禁用，1-启用')
    created_at = Column(DateTime, nullable=False, default=func.now(), comment='创建时间')
    updated_at = Column(DateTime, nullable=False, default=func.now(),
                       onupdate=func.now(), comment='更新时间')

    def set_password(self, password):
        """
        设置密码哈希
        目的：将明文密码加密存储到数据库
        功能：使用SHA256算法对密码进行哈希加密

        Args:
            password (str): 明文密码
        """
        self.password_hash = hashlib.sha256(password.encode()).hexdigest()

    def check_password(self, password):
        """
        验证密码
        目的：验证用户输入的密码是否正确
        功能：将输入的明文密码进行SHA256加密后与数据库中的哈希值比较

        Args:
            password (str): 待验证的明文密码

        Returns:
            bool: 密码正确返回True，否则返回False
        """
        # 使用SHA256加密输入的密码
        sha256_hash = hashlib.sha256(password.encode()).hexdigest()
        # 与数据库中存储的密码哈希比较
        return self.password_hash == sha256_hash

    def to_dict(self):
        """
        转换为字典格式
        目的：将User对象序列化为JSON格式，方便API响应
        功能：返回用户的基本信息，动态生成头像URL
        """
        # 如果有头像路径，动态生成访问URL
        avatar_url = None
        if self.avatar:
            try:
                from app.services.minio_service import MinioService
                minio_service = MinioService()
                # 使用存储的文件路径生成预签名URL（7天有效期）
                avatar_url = minio_service.get_presigned_url(self.avatar, 'images', expires=86400*7)
            except Exception:
                # 如果生成失败，返回原始路径
                avatar_url = self.avatar

        return {
            'id': self.id,
            'username': self.username,
            'email': self.email,
            'nickname': self.nickname,
            'avatar': avatar_url,  # 返回完整的访问URL
            'bio': self.bio,
            'phone': self.phone,
            'status': self.status,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }